package emuLoader.biz;

import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;

import nayasis.common.db.manager.DatabaseManager;
import nayasis.common.db.manager.transaction.TxManager;
import nayasis.common.db.sql.Statement;
import nayasis.common.model.NData;
import nayasis.common.model.NMultiData;
import nayasis.common.util.StringUtil;

public class GameData {

	/**
	 * DB 테이블을 DROP 시킨다.
	 * 
	 * @param tableName 테이블명
	 */
	public void dropTable( String tableName ) {
		
		Statement stmt = DatabaseManager.getStatement();
		
		stmt.setSql( StringUtil.format("DROP TABLE IF EXISTS @", tableName) ).executeUpdate();
		
		TxManager.commit();
		
	}

	/**
	 * 게임 목록을 저장한다.
	 * 
	 * @param data [ {dir, file} ]
	 */
	public void createGameInfo( String emulKind, NMultiData data ) {
		
		createTableGameList();

		for( NData game : data ) {
			
			String path = game.getString( "dir"  );
			String file = game.getString( "file" );
			
			String title = getTitle( path );
			
			insertGameInfo( emulKind, path, title, getCategory(path), getYear(title), getManufacturer(title), null );
			insertGameFile( emulKind, path, file );

		}
		
		TxManager.commit();
		
	}

	private String getTitle( String path ) {
		
		if( path == null || path.length() == 0 ) return path;
		
		return path.substring( path.lastIndexOf( File.separator ) + 1 );
		
	}

	private String getCategory( String path ) {
		
		if( path == null || path.length() == 0 ) return path;
		
		int lastIndex = path.lastIndexOf( File.separator );
		
		int fromIndex = path.lastIndexOf( File.separator, lastIndex - 1 );
		
		String tmp = path.substring( fromIndex + 1, lastIndex );
		
		return tmp;
		
	}

	private String getYear( String title ) {

		if( title == null || title.length() == 0 ) return title;
		
		String result = "";
		
		// TODO : 문자열에서 년도를 추출하는 로직을 만들어야 함

		return result;
		
	}

	private String getManufacturer( String title ) {
		
		if( title == null || title.length() == 0 ) return title;
		
		String result = "";
		
		// TODO : 문자열에서 제조사를 추출하는 로직을 만들어야 함
		
		return result;
		
	}
	
	/**
	 * 게임목록 테이블을 신규로 생성한다.
	 */
	public void createTableGameList() {

		Statement stmt = DatabaseManager.getStatement();
		stmt.setSql( "/game/createTableGameList" ).executeUpdate();
		stmt.setSql( "/game/createTableGameFile" ).executeUpdate();
		
		TxManager.commit();
	
	}

	/**
	 * 게임 정보를 입력한다.
	 * 
	 * @param emulKind		emul 종류 (PK)
	 * @param path			실행시킬 파일 경로 (PK)
	 * @param title			타이틀
	 * @param category		분류
	 * @param year			년도
	 * @param manufacturer	제작사
	 * @param run			실행 스크립트
	 */
	public void insertGameInfo( String emulKind, String path, String title, String category, String year, String manufacturer, String run ) {

		Statement stmt = DatabaseManager.getStatement();
		
		stmt.setSql( "/game/insertGameInfo" );
		
		stmt.setString( "emulKind",     emulKind     );
		stmt.setString( "path",         path         );
		stmt.setString( "title",        title        );
		stmt.setString( "category",     category     );
		stmt.setString( "playTime",     "00:00:00"   );
		stmt.setString( "year",         year         );
		stmt.setString( "manufacturer", manufacturer );
		stmt.setString( "run",          run          );
	 	
		stmt.executeUpdate();

	}

	/**
	 * 게임을 구동시킬 파일정보를 입력한다.
	 * 
	 * @param emulKind		emul 종류 (PK)
	 * @param path			실행시킬 파일 경로 (PK)
	 * @param file          게임을 구동시킬 파일정보
	 */
	public void insertGameFile( String emulKind, String path, String file ) {

		Statement stmt = DatabaseManager.getStatement();
		
		stmt.setSql( "/game/insertGameFile" );
		
		stmt.setString( "emulKind", emulKind );
		stmt.setString( "path",     path     );
		stmt.setString( "file",     file     );
	 	
		stmt.executeUpdate();
		
	}
	
	/**
	 * 게임정보를 삭제한다.
	 * 
	 * @param emulKind		emul 종류 (PK)
	 * @param path			실행시킬 파일 경로 (PK)
	 */
	public void deleteGameInfo( String emulKind, String path ) {

		deleteGameFile( emulKind, path );
		
		Statement stmt = DatabaseManager.getStatement();
		
		stmt.setSql( "/game/deleteGameInfo" );
		
		stmt.setString( "emulKind", emulKind );
		stmt.setString( "path",     path     );
	 	
		stmt.executeUpdate();

	}

	/**
	 * 게임을 구동시킬 파일정보를 삭제한다.
	 * 
	 * @param emulKind		emul 종류 (PK)
	 * @param path			실행시킬 파일 경로 (PK)
	 */
	public void deleteGameFile( String emulKind, String path ) {
		
		Statement stmt = DatabaseManager.getStatement();
		
		stmt.setSql( "/game/deleteGameFile" );
		
		stmt.setString( "emulKind", emulKind );
		stmt.setString( "path",     path     );
		
		stmt.executeUpdate();
		
	}

	
	/**
	 * 게임정보를 조회한다.
	 * 
	 * @return
	 */
	public NMultiData retrieveGameInfo( String emulKind ) {

		Statement stmt = DatabaseManager.getStatement();
		
		stmt.setSql( "/game/retrieveGameList" );
		
		stmt.setString( "emulKind", emulKind );

		return stmt.executeQuery();
		
	}

	/**
	 * RomSeletor에서 사용되는 게임목록 정보를 조회한다.
	 * 
	 * @param emulKind 에뮬종류
	 * @return [ {dir, file, path} ]
	 */
	public NMultiData retrieveGameFile( String emulKind ) {
		
		Statement stmt = DatabaseManager.getStatement();
		
		stmt.setSql( "/game/retrieveGameFile" );
		
		stmt.setString( "emulKind", emulKind );

		NMultiData rs = stmt.executeQuery();
		
		for( NData row : rs ) {
			
			String dir  = row.getString( "path" );
			String file = row.getString( "file" );
			
			Path path = Paths.get( dir, file );
			
			row.put( "dir",  dir  );
			row.put( "path", path );
			
		}
		
		return rs;
		
	}
	
}
